/***********************************************************************************
Copy right:	    Coffee Tech.
Author:         jiaoyue
Date:           2022-04-08
Description:    所有的处理都在这个文件里进行
***********************************************************************************/

#include "server.h"
#include "mqtt.h"
#include "serial.h"
#include "cJSON.h"

#define LAMP_ON    "{\"lamp\":true}"
#define LAMP_OFF   "{\"lamp\":false}"

/**
 * @brief 把指令解析处理，按照设备/虚拟仿真协议要求发送
 * @param data
 * @return
 */
int handle_msg_from_qt(node_t data)
{
#ifdef DEV_SIMULATION
    char json_str[1024] = {0};
    switch (data.key) {
    case CTL_MODE:  //模式控制，先处理
        if(data.val.i_val == MANUAL_MODE)
        {
            printf("cur mode = manual\n");
        }
        else if(data.val.i_val == AUTO_MODE)
        {
            printf("cur mode = auto\n");
        }
        else
        {
            printf("err mode\n");
        }
    case SIM_DIANDENG:
        //按照虚拟仿真协议要求，组包，发送
        if(data.val.b_val == TRUE)  //开灯
        {
            strcpy(json_str, LAMP_ON);
        }
        else //关灯
        {
            strcpy(json_str, LAMP_OFF);
        }
        mqtt_publish(PUB_TOPIC, json_str);
        break;
    default:
        printf("not implemented yet\n");
        break;
    }
#else
    serial_write(data);
#endif
    return 0;
}


/**
 * @brief 解析虚拟仿真来的数据发送给QT客户端
 * @param topic_name
 * @param payload
 * @return
 */
int handle_msg_from_simulation(const char *topic_name, const char *payload)
{
    printf("topic_name=%s, payload=%s\n", topic_name, payload);
    node_t data;
    BOOL send_flag = FALSE;

    //这里根据虚拟仿真软件定的协议解析出具体哪个寄存器的变化，然后上报给QT客户端
    cJSON * root = NULL;
    cJSON * item = NULL;//cjson对象

    root = cJSON_Parse(payload);
    if (!root)
    {
        printf("parse err\n");
        return -1;
    }

    item = cJSON_GetObjectItem(root, "light");
    if(NULL != item)  //代表是光照传感器
    {
        //获取它的值
        data.key = SIM_GUANGZHAO;
        data.val.f_val = atof(item->valuestring);
        send_flag = TRUE;
    }

    if(!connect_state())
    {
        //如果没有客户端连接，就不用发了
        send_flag = FALSE;
    }
    if(send_flag)
    {
        send_data(data);
    }

    return 0;
}

int handle_msg_from_serial(node_t data)
{
    //从串口来的数据，应该上报给QT客户端
    send_data(data);
}
